package com.xbongbong.paas.service;

import com.xbongbong.paas.pojo.AliyunCallCenterPojo;
import com.xbongbong.paas.pojo.CallLogPojo;
import com.xbongbong.paas.pojo.ItemDataPoJo;
import com.xbongbong.paas.pojo.dto.AliyunBatchUpdateCallRecordDTO;
import com.xbongbong.paas.pojo.dto.AliyunBatchUpdateDTO;
import com.xbongbong.paas.pojo.dto.AliyunCallBatchInsertDTO;
import com.xbongbong.paas.pojo.dto.AliyunCallCenterListDTO;
import com.xbongbong.paas.pojo.dto.AliyunCallCenterModelDTO;
import com.xbongbong.paas.pojo.dto.AliyunCallGetCallListDTO;
import com.xbongbong.paas.pojo.dto.AliyunCallRecordConditionReqDTO;
import com.xbongbong.paas.pojo.dto.AliyunCallSaveCommunicateReqDTO;
import com.xbongbong.paas.pojo.dto.AliyunCallUserInfoConditionReqDTO;
import com.xbongbong.paas.pojo.dto.AliyunCallcenterRecentlyRecordDTO;
import com.xbongbong.paas.pojo.dto.AliyunListSyncCallRecordDTO;
import com.xbongbong.paas.pojo.dto.AliyunListUnSyncCallRecordDTO;
import com.xbongbong.paas.pojo.dto.BlockRuleRemindDTO;
import com.xbongbong.paas.pojo.dto.CallAudioTranslateDTO;
import com.xbongbong.paas.pojo.dto.CallCallLogListDTO;
import com.xbongbong.paas.pojo.dto.CallCallLogSaveDTO;
import com.xbongbong.paas.pojo.dto.CallMissedCallListDTO;
import com.xbongbong.paas.pojo.dto.CallRecordConfigDTO;
import com.xbongbong.paas.pojo.dto.CallRecordDynamicDTO;
import com.xbongbong.paas.pojo.dto.CallRecordLogSaveDTO;
import com.xbongbong.paas.pojo.dto.CallRecordStaticDTO;
import com.xbongbong.paas.pojo.dto.ExternalCallRecordDTO;
import com.xbongbong.paas.pojo.dto.ExternalSumCallRecordDTO;
import com.xbongbong.paas.pojo.dto.UinSumCallRecordDTO;
import com.xbongbong.paas.pojo.dto.UinYunCallRecordDTO;
import com.xbongbong.paas.pojo.dto.YunCallDepAllUserListDTO;
import com.xbongbong.paas.pojo.dto.YunCallPageRecordDTO;
import com.xbongbong.paas.pojo.vo.AddCommunicateVO;
import com.xbongbong.paas.pojo.vo.AliyunCallGetCallListVO;
import com.xbongbong.paas.pojo.vo.AliyunCallUserInfoConditionVO;
import com.xbongbong.paas.pojo.vo.AliyunCallcenterListVO;
import com.xbongbong.paas.pojo.vo.AliyunCallcenterRecentlyRecordVO;
import com.xbongbong.paas.pojo.vo.BlockRuleRemindVO;
import com.xbongbong.paas.pojo.vo.CallAudioTranslateVO;
import com.xbongbong.paas.pojo.vo.CallCallLogSaveVO;
import com.xbongbong.paas.pojo.vo.CallCenterAccountUserInfoVO;
import com.xbongbong.paas.pojo.vo.CallLogListVO;
import com.xbongbong.paas.pojo.vo.CallLogRecordStaticVO;
import com.xbongbong.paas.pojo.vo.CallRecordConfigVO;
import com.xbongbong.paas.pojo.vo.ExternalSumCallRecordVO;
import com.xbongbong.paas.pojo.vo.UinSumCallRecordVO;
import com.xbongbong.paas.pojo.vo.YunCallRecordPageVO;
import com.xbongbong.paas.toolbox.exception.XbbException;
import com.xbongbong.paas.toolbox.wrap.BaseDTO;
import com.xbongbong.paas.toolbox.wrap.XbbResponse;
import com.xbongbong.saas.domain.entity.CallCenterCallLogEntity;

import java.util.List;

/**
 * @author youli.chen
 * @version v1.0
 * @description: 话务中心通话记录业务层接口
 * @date 2019/2/18 21:48
 * @since v1.0
 */
public interface CallCenterCallLogService {

    /**
     * 保存通话记录
     *
     * @param callCallLogSaveDTO 保存通话记录入参
     * @return CallCallLogSaveVO  保存通话记录回参
     * @throws XbbException
     */
    XbbResponse<CallCallLogSaveVO> callLogSave(CallCallLogSaveDTO callCallLogSaveDTO) throws XbbException;

    /**
     * 保存通话记录(二次开发)
     *
     * @param callRecordLogSaveDTO 保存通话记录入参
     * @return
     * @throws XbbException
     */
    Boolean callRecordLogSave(CallRecordLogSaveDTO callRecordLogSaveDTO) throws XbbException;

    /**
     * 未接来电记录
     *
     * @param callMissedCallListDTO 未接来电记录入参
     * @return CallMissedCallListVO  未接来电记录回参
     * @throws XbbException
     */
    XbbResponse<CallLogListVO> missedCallList(CallMissedCallListDTO callMissedCallListDTO) throws XbbException;

    /**
     * 防封号提醒
     *
     * @param blockRuleRemindDTO 防封号规则提醒入参
     * @return BlockRuleRemindVO  防封号规则提醒回参
     * @throws XbbException
     */
    XbbResponse<BlockRuleRemindVO> blockRuleRemind(BlockRuleRemindDTO blockRuleRemindDTO) throws XbbException;

    /**
     * 通话记录列表
     *
     * @param callCallLogListDTO 通话记录列表
     * @return CallMissedCallListVO  通话记录列表回参
     * @throws XbbException
     */
    CallLogListVO callLogList(CallCallLogListDTO callCallLogListDTO) throws XbbException;

    /**
     * 查找度言未接来电通话记录
     *
     * @param callCallLogListDTO 查找度言未接来电通话记录
     * @return CallMissedCallListVO  查找度言未接来电通话记录回参
     * @throws XbbException
     */
    XbbResponse<CallLogListVO> orgMissedCallList(CallCallLogListDTO callCallLogListDTO) throws XbbException;

    /**
     * 获取通话记录的录音（直接拼接度言通话录音文件的路径，格式.oga）
     *
     * @param callRecordStaticDTO 获取通话记录的录音（直接拼接度言通话录音文件的路径，格式.oga）入参
     * @return CallLogRecordStaticVO  获取通话记录的录音（直接拼接度言通话录音文件的路径，格式.oga）回参
     * @throws XbbException
     */
    XbbResponse<CallLogRecordStaticVO> callLogRecordStatic(CallRecordStaticDTO callRecordStaticDTO) throws XbbException;

    /**
     * 获取通话记录的录音（通过度言API获取文件路径，最后得到.oga的路径）
     *
     * @param callRecordDynamicDTO 获取通话记录的录音（通过度言API获取文件路径，最后得到.oga的路径）入参
     * @return CallLogRecordStaticVO  获取通话记录的录音（通过度言API获取文件路径，最后得到.oga的路径）回参
     * @throws XbbException
     */
    XbbResponse<CallLogRecordStaticVO> callLogRecordDynamic(CallRecordDynamicDTO callRecordDynamicDTO) throws XbbException;


    /**
     * 坐席查找：根据业务对象封装的条件查找符合的列表
     *
     * @param callCallLogListDTO 业务对象封装的条件
     * @param isActiveAliyunCall 是否有云呼的权限
     * @return CallCenterCallLogParamVO 符合条件的话务中心通话记录列表
     * @throws XbbException 业务异常
     * @author youli.chen
     * 修改时间：
     * @version v1.0
     * @since v1.0
     */
    CallLogListVO getAgentCallLogList(CallCallLogListDTO callCallLogListDTO, boolean isActiveAliyunCall) throws XbbException;

    /**
     * 团队主管查找：根据业务对象封装的条件查找符合的列表
     *
     * @param callCallLogListDTO 业务对象封装的条件
     * @return CallCenterCallLogParamVO 符合条件的话务中心通话记录列表
     * @throws XbbException 业务异常
     * @author youli.chen
     * 修改时间：
     * @version v1.0
     * @since v1.0
     */
    CallLogListVO getSupervisorCallLogList(CallCallLogListDTO callCallLogListDTO) throws XbbException;

    /**
     * 超管查找：根据业务对象封装的条件查找符合的列表
     *
     * @param callCallLogListDTO 业务对象封装的条件
     * @return CallCenterCallLogParamVO 符合条件的话务中心通话记录列表
     * @throws XbbException 业务异常
     * @author youli.chen
     * 修改时间：
     * @version v1.0
     * @since v1.0
     */
    CallLogListVO getAdminCallLogList(CallCallLogListDTO callCallLogListDTO) throws XbbException;

    /**
     * 封装通话记录的更多详情（以及添加已经被转为客户的通话记录）
     *
     * @param corpid      公司id
     * @param callLogList 通话记录列表
     * @throws XbbException 业务异常
     * @author youli.chen
     * 修改时间：
     * @version v1.0
     * @since v1.0
     */
    void initCallLogInfo4Show(String corpid, List<CallLogPojo> callLogList) throws XbbException;

    /**
     * 封装通话记录的坐席名称
     *
     * @param corpid      公司Id
     * @param callLogList 通话记录列表
     * @throws XbbException 业务异常
     * @author youli.chen
     * 修改时间：
     * @version v1.0
     * @since v1.0
     */
    void initCallLogListUserName(String corpid, List<CallLogPojo> callLogList) throws XbbException;

    /**
     * 封装已经被转为客户的陌生号码的客户名称
     *
     * @param corpid      公司Id
     * @param callLogList 通话记录列表
     * @throws XbbException 业务异常
     * @author youli.chen
     * 修改时间：
     * @version v1.0
     * @since v1.0
     */
    void initCallLogListRefName(String corpid, List<CallCenterCallLogEntity> callLogList) throws XbbException;

    /**
     * 封装客户模板设置的号码是否可见属性
     *
     * @param corpid      公司Id
     * @param callLogList 通话记录列表
     * @throws XbbException 业务异常
     */
    void initCallLogListPhone(CallCallLogListDTO callCallLogListDTO, String corpid, List<CallLogPojo> callLogList) throws XbbException;

    /**
     * 管理员获取未接来电
     *
     * @param callCallLogListDTO 通话记录请求参数
     * @return CallCenterCallLogResponseParamPojo 封装的通话记录返回参数
     * @throws XbbException 业务异常
     * @author youli.chen
     * 修改时间：
     * @version v1.0
     * @since v1.0
     */
    CallLogListVO getAdminMissedCallLogList(CallCallLogListDTO callCallLogListDTO) throws XbbException;

    /**
     * 团队主管获取未接来电
     *
     * @param callCallLogListDTO 通话记录请求参数
     * @return CallCenterCallLogResponseParamPojo 封装的通话记录返回参数
     * @throws XbbException 业务异常
     * @author youli.chen
     * 修改时间：
     * @version v1.0
     * @since v1.0
     */
    CallLogListVO getSupervisorMissedCallLogList(CallCallLogListDTO callCallLogListDTO) throws XbbException;

    /**
     * 通过远程通话记录列表获取通话记录详情
     *
     * @param corpid     公司id
     * @param id         通话记录ID
     * @param moduleType 第三方话务平台，参考AppStoreTypeEnum
     * @param callTime   通话开始时间
     * @param target     目标用户号码
     * @param result     通话结果
     * @return CallCenterCallLogEntity 封装好的通话记录
     * @throws XbbException 业务异常
     * @author youli.chen
     * 修改时间：
     * @version v1.0
     * @since v1.0
     */
    CallCenterCallLogEntity getOriginCallLogDetailByList(String corpid, Long id, Integer moduleType,
                                                         Integer callTime, String target, Integer result) throws XbbException;


    /**
     * 获取未接来电列表
     *
     * @param corpid     公司id
     * @param moduleType 第三方话务平台，参考AppStoreTypeEnum
     * @param userInfoVO 话务中心员工信息
     * @param page       页码
     * @param pageSize   页容量
     * @return List<CallLogPojo> 通话记录列表
     * @throws XbbException 业务异常
     * @author youli.chen
     * 修改时间：
     * @version v1.0
     * @since v1.0
     */
    CallLogListVO getMissedCallLogList(String corpid, Integer moduleType, CallCenterAccountUserInfoVO userInfoVO,
                                       Integer page, Integer pageSize) throws XbbException;

    /**
     * 移动端创建的通话记录需要同步
     *
     * @param corpid      公司Id
     * @param moduleType  话务中心平台类型
     * @param callLogList 通话记录列表
     * @throws XbbException 业务异常
     * @author youli.chen
     * 修改时间：
     * @version v1.0
     * @since v1.0
     */
    void syncCallLog(String corpid, Integer moduleType, List<CallCenterCallLogEntity> callLogList) throws XbbException;

    /**
     * 同步移动端近一天需要同步的通话记录
     *
     * @param corpid     公司Id
     * @param userId     用户Id
     * @param moduleType 话务中心平台类型
     * @throws XbbException 业务异常
     * @author youli.chen
     * 修改时间：
     * @version v1.0
     * @since v1.0
     */
    void syncTodayMobileCallLog(String corpid, String userId, Integer moduleType) throws XbbException;

    /**
     * 提交翻译录音文件的任务
     *
     * @param callCenterCallLogEntity 通话录音
     * @param telPlat                 翻译的平台，小写字母拼写，参考StringConstant
     * @param callAudioTranslateVO    翻译录音文件的任务回参
     * @return callAudioTranslateVO    翻译录音文件的任务回参
     * @throws XbbException 封装异常
     * @author youli.chen
     * 修改时间：
     * @version v1.0
     * @since v1.0
     */
    CallAudioTranslateVO submitTranslateTask(CallCenterCallLogEntity callCenterCallLogEntity, String telPlat, CallAudioTranslateVO callAudioTranslateVO) throws XbbException;

    /**
     * 计算该公司的通话总时长
     *
     * @param corpid 公司id
     * @return 通话时长
     * @throws XbbException 业务异常
     * @author youli.chen
     * 修改时间：
     * @version v1.0
     * @since v1.0
     */
    Integer sumMonthlyCallDuration(String corpid) throws XbbException;

    /**
     * 获取最后一次通话时间
     *
     * @param corpid 公司id
     * @param userId 用户id
     * @return 通话时间10位int
     * @throws XbbException 业务异常
     * @author youli.chen
     * 修改时间：
     * @version v1.0
     * @since v1.0
     */
    Integer getLastCallTime(String corpid, String userId) throws XbbException;

    /**
     * 获取录音文件的路径（获取后将更新持久层通话记录）直接拼接录音路径
     *
     * @param corpid                  公司id
     * @param moduleType              第三方话务平台，参考CallCenterTypeEnum
     * @param target                  通话号码
     * @param callTime                通话时间
     * @param callCenterCallLogEntity 本地存储的通话记录持久层对象
     * @return String 录音文件路径
     * @throws XbbException 业务异常
     * @author youli.chen
     * 创建时间：2019/1/15 下午7:00
     * 修改时间：
     * @version v1.0
     * @since v1.0
     */
    String getCallLogRecordUrlStatic(String corpid, Integer moduleType, String target, Integer callTime,
                                     CallCenterCallLogEntity callCenterCallLogEntity) throws XbbException;

    /**
     * 获取录音文件的路径（获取后将更新持久层通话记录）直接拼接录音路径
     *
     * @param corpid                  公司id
     * @param moduleType              第三方话务平台，参考CallCenterTypeEnum
     * @param callCenterCallLogEntity 本地存储的通话记录持久层对象
     * @return String 录音文件路径
     * @throws XbbException 业务异常
     *                      创建时间：2019/1/15 下午7:00
     * @version v1.0
     * @since v1.0
     */
    String getCallLogRecordUrlByUuidStatic(String corpid, Integer moduleType,
                                           CallCenterCallLogEntity callCenterCallLogEntity) throws XbbException;

    /**
     * 获取录音文件的路径（获取后将更新持久层通话记录）通过API获取
     *
     * @param corpid                  公司id
     * @param moduleType              第三方话务平台，参考AppStoreTypeEnum
     * @param target                  通话号码
     * @param callTime                通话时间
     * @param callCenterCallLogEntity 本地存储的通话记录持久层对象
     * @return String 录音文件路径
     * @throws XbbException 业务异常
     * @author youli.chen
     * 创建时间：2019/1/15 上午9:30
     * 修改时间：
     * @version v1.0
     * @since v1.0
     */
    String getCallLogRecordUrlDynamic(String corpid, Integer moduleType, String target, Integer callTime,
                                      CallCenterCallLogEntity callCenterCallLogEntity) throws XbbException;

    /**
     * 获取录音文件的路径（获取后将更新持久层通话记录）通过API获取
     *
     * @param corpid                  公司id
     * @param moduleType              第三方话务平台，参考AppStoreTypeEnum
     * @param callCenterCallLogEntity 本地存储的通话记录持久层对象
     * @return String 录音文件路径
     * @throws XbbException 业务异常
     * @author youli.chen
     * 创建时间：2019/1/15 上午9:30
     * 修改时间：
     * @version v1.0
     * @since v1.0
     */
    String getCallLogRecordUrlByUuidDynamic(String corpid, Integer moduleType,
                                            CallCenterCallLogEntity callCenterCallLogEntity) throws XbbException;

    /**
     * 通话录音语音转写
     *
     * @param callAudioTranslateDTO 通话录音语音转写入参
     * @return CallAudioTranslateVO  通话录音语音转写回参
     * @throws XbbException
     */
    CallAudioTranslateVO audioTranslate(CallAudioTranslateDTO callAudioTranslateDTO) throws XbbException;

    /**
     * 新增一条阿里云呼通话记录
     * 此本新增只是在数据库先插入记录，具体内容待通话结束后保存
     *
     * @param aliyunCallCenterModelDTO 通话记录数据
     * @return 影响行数
     * @throws XbbException 销帮帮异常
     */
    Integer aliyunCallCenterInsert(AliyunCallCenterModelDTO aliyunCallCenterModelDTO) throws XbbException;

    /**
     * 更新一条阿里云呼通话记录
     *
     * @param aliyunCallCenterModelDTO 通话记录数据
     * @return 影响行数
     * @throws XbbException 销帮帮异常
     */
    Integer updateAliyunCallCenter(AliyunCallCenterModelDTO aliyunCallCenterModelDTO) throws XbbException;

    /**
     * 查询通话记录列表
     *
     * @param aliyunCallCenterListDTO 通话记录列表
     * @return 通话记录列表回参
     * @throws XbbException 销帮帮异常
     */
    AliyunCallcenterListVO aliyunCallCenterList(AliyunCallCenterListDTO aliyunCallCenterListDTO) throws XbbException;

    /**
     * 根据电话号查询最近通话记录
     *
     * @param recentlyRecordDTO 电话号
     * @return 最近通话记录
     */
    AliyunCallcenterRecentlyRecordVO findRecentlyCallRecord(AliyunCallcenterRecentlyRecordDTO recentlyRecordDTO) throws XbbException;

    /**
     * 根据条件查询通话记录的查询条件信息
     *
     * @param conditionReqDTO 条件查询
     * @return 查询条件信息
     */
    List<ItemDataPoJo> findAliyunCallRecordCondition(AliyunCallRecordConditionReqDTO conditionReqDTO) throws XbbException;

    /**
     * description:  阿里云呼叫中心根据号码查询用户信息  callLogSave    labelHelp.dealId2Pojo4One
     * date: 2021/7/15 10:05 上午
     *
     * @Author yingjf
     */
    AliyunCallUserInfoConditionVO findUserInfoCondition(AliyunCallUserInfoConditionReqDTO aliyunCallUserInfoConditionReqDTO) throws XbbException;

    /**
     * @return
     * @Author yingjf
     * @Description //阿里云呼叫中心控制台新增跟进记录
     * @Date 9:14 上午 2021/7/16
     * @Param
     **/
    AddCommunicateVO saveCommunicate(AliyunCallSaveCommunicateReqDTO aliyunCallSaveCommunicateReqDTO) throws XbbException;

    /**
     * 初始化相关参数自动上传通话记录
     *
     * @param callRecordConfigDTO 获取基本配置入参
     * @return CallRecordConfigVO 基本配置信息
     * @throws XbbException
     */
    CallRecordConfigVO getAutoUploadConfig(CallRecordConfigDTO callRecordConfigDTO) throws XbbException;

    /**
     * description: 查询云呼同步的通话记录
     * date: 2021/9/10 10:02 上午
     *
     * @Author yingjf
     */
    List<AliyunCallCenterPojo> listSyncCallRecord(AliyunListSyncCallRecordDTO recordDTO) throws XbbException;


    /**
     * 查询未同步通话录音的通话记录
     *
     * @param recordDTO 请求信息
     * @return 未同步通话录音的通话记录
     * @throws XbbException 异常
     */
    List<AliyunCallCenterPojo> listUnsyncCallRecord(AliyunListUnSyncCallRecordDTO recordDTO) throws XbbException;

    /**
     * 批量跟新阿里云呼叫中心的通话记录
     *
     * @param updateDTO 修改类
     * @return 影响行数
     * @throws XbbException 异常
     */
    Integer batchUpdateAliyunCallCenter(AliyunBatchUpdateDTO updateDTO) throws XbbException;

    /**
     * 工作台查询通话记录列表
     *
     * @param aliyunCallCenterListDTO 通话记录列表
     * @return 通话记录列表回参
     * @throws XbbException 销帮帮异常
     */
    AliyunCallcenterListVO aliyunCallCenterWorkbenchList(AliyunCallCenterListDTO aliyunCallCenterListDTO) throws XbbException;

    /**
     * 号码系统权限
     */
    public Boolean getNumberVisibleh(String anotherPhoneNum, BaseDTO baseDTO) throws XbbException;

    /**
     * 批量跟新阿里云呼叫中心的通话记录录音
     *
     * @param updateDTO 修改类
     * @return 影响行数
     * @throws XbbException 异常
     */
    Integer batchUpdateAliyunCallRecordCenter(AliyunBatchUpdateCallRecordDTO updateDTO) throws XbbException;

    /**
     * 批量新增阿里云呼通话记录
     * 此本新增只是在数据库先插入记录，具体内容待通话结束后保存
     *
     * @param callLogDto 通话记录数据
     * @return 影响行数
     */
    Integer aliyunCallBatchInsert(AliyunCallBatchInsertDTO callLogDto) throws XbbException;

    /**
     * 根据当前人权限获取老的呼叫中心的人员列表，主要为了团队成员需求
     *
     * @param callCallLogListDTO
     * @return
     */
    List<String> getCallCenterUserListByLoginUser(CallCallLogListDTO callCallLogListDTO) throws XbbException;

    /**
     * description: 根据部门，人员，和时间范围，查询通话记录
     * date: 2022/9/10 10:02 上午
     *
     * @Author jiping.yang
     */
    AliyunCallGetCallListVO getCallList(AliyunCallGetCallListDTO listDTO) throws XbbException;

    /**
     * 新增一条优音云呼的通话记录
     *
     * @param dto 云呼的通话记录数据
     * @return 影响行数
     * @throws XbbException 销帮帮异常
     */
    Integer addUinYunCallRecord(UinYunCallRecordDTO dto) throws XbbException;

    /**
     * 云呼分页查询通话记录
     *
     * @param pageDto 分页信息
     * @return 通话记录
     * @throws XbbException 异常
     */
    YunCallRecordPageVO yunCallRecordPage(YunCallPageRecordDTO pageDto) throws XbbException;

    /**
     * 获取当前人员部门下所有的用户ID
     *
     * @param dto 当前人员
     * @return 部门下所有的用户ID
     * @throws XbbException 异常
     */
    List<String> listDepAllUser(YunCallDepAllUserListDTO dto) throws XbbException;

    /**
     * 优音统计通话记录信息
     *
     * @param dto 请求信息
     * @return 统计通话记录信息
     * @throws XbbException 异常
     */
    UinSumCallRecordVO uinSumCallRecord(UinSumCallRecordDTO dto) throws XbbException;

    /**
     * 新增一条外接系统的通话记录
     *
     * @param dto 云呼的通话记录数据
     * @return 影响行数
     * @throws XbbException 销帮帮异常
     */
    Integer addExternalCallRecord(ExternalCallRecordDTO dto) throws XbbException;

    /**
     * 优音统计通话记录信息
     *
     * @param dto 请求信息
     * @return 统计通话记录信息
     * @throws XbbException 异常
     */
    ExternalSumCallRecordVO externalSumCallRecord(ExternalSumCallRecordDTO dto) throws XbbException;
}
